package com.tedu.review.day02;

/**
 * 普通类
 * 抽象类=抽象方法       关键字   abstract
 * 只有行为的概念  没有具体的实现行为
 *
 *
 * 与面向对象的多态有绝对关系
 * 产生子类【实现类】 同时具备实现的属性和方法
 *
 * 什么下情况是使用
 * 复杂项目时  需要在不同类中实现  不同功能  首选抽象类【Android常用】
 *
 * 定义抽象类：
 * 修饰符  abstract class 类名{}    抽象类本身没有任何意义
 * 创建抽象类同时必须存在抽象方法
 * 修饰符  abstract  返回值  方法名（）；  定义抽象的方法 提供给子类使用
 *
 * 抽象类实例化：
 * 必须使用多态  向上造型  自身无法实例化  子类【实现类】
 *
 * 定义    使用     注意
 *
 * 抽象类使用注意：抽象类和抽象方法必须使用abstract 关键字
 *              可以定义静态属性 静态方法 不可以定义抽象属性
 *              可以存在构造器 不可以定义静态抽象方法 静态抽象属性
 *              可以存在内部类：静态内部类 抽象类 继承抽象类
 *              Java只允许单继承 实现只需要继承子抽象类
 *              final不能修饰抽象方法
 *
 */
abstract /*static*/ class Animals{
    //1.可以使用static修饰    √
    //类定义：修饰符[abstract static] class 类名{}
   public abstract void say();//抽象方法：没有任何实现
    //2.定义一个修饰final的抽象方法   ×
   // public final abstract void sleep();
    //3.定义一个抽象属性× 定义静态属性   √
    //abstract int i；
    static int i;  //声明未赋值
    //4.定义抽象静态属性 ×
    //static  abstract int j;
    //5.定义静态抽象方法  ×  语法：修饰符【static abstract】 返回值 方法名
   // public static abstract void eat(){};
    //6.定义一个静态方法√
    public static void eat(){};
    //7.可以存在内部类 可以存在静态内部类  √
            public static class Sos{}
    //8.抽象类构造器---√

    public Animals() {
    }
}
//9.抽象类可以继承抽象类吗       √
abstract class Thing extends Animals{
    //成员变量
    protected abstract int result();
}
//实现类：子类  继承  抽象类  完成 ：抽象类方法
//10.实现类【子类】继承两个抽象类    ×      但是  实现最终继承【子】抽象类
class People extends Animals{

    @Override
    public void say() {
        System.out.println("人---说话");
    }
}
//实现类:假设 Animals  有两个抽象方法  请问：子类需要实现抽象类全部抽象方法
class Monkey extends Animals{

    @Override
    public void say() {
        System.out.println("猴 ---说话");
    }
}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类----实例化【创建对象】---多态：向上造型
        Animals a=new People();
        a.say();  //输出:重写后的值   【方法互通】
        //实现抽象类实例化
        Animals a1=new Monkey();
        a1.say(); //输出：重写后的值【方法互通】
    }
}
